package com.md.model.base;

import com.md.util.ColorUtil;
import lombok.Data;

import static com.md.util.ExcelUtil.applyTint;
import static com.md.util.ExcelUtil.byteArrayToHexStr;
import static com.md.value.ReadFileConstants.MAX_RGB_BYTE_ARRAY_LENGTH;

/**
 * @author 刘骄阳
 * 2024-05-14 18:58
 */
@Data
public class ColorInfo {
  /**
   * 附加色彩
   */
  private Double tint;
  /**
   * 主题颜色字节数组[红,绿,蓝]
   */
  private byte[] themeRGB;
  /**
   * 颜色byte字节数组[alpha,红,绿,蓝]
   */
  private byte[] rgb;
  /**
   * hsl
   */
  private double[] hsl;

  public ColorInfo() {
    tint = 0D;
  }

  /**
   * 获取主题颜色
   *
   * @return 主题颜色
   */
  public String getThemeColor() {
    byte[] rgbByte = getRGBByte(themeRGB);
    if (rgbByte.length == 0) {
      return null;
    }
    return byteArrayToHexStr(rgbByte);
  }

  /**
   * 获取rgb颜色
   *
   * @return rgb颜色
   */
  public String getRGBColor() {
    byte[] rgbByte = getRGBByte(rgb);
    if (rgbByte.length == 0) {
      return null;
    }
    int byteLength = rgbByte.length;
    if (byteLength != MAX_RGB_BYTE_ARRAY_LENGTH) {
      // 过滤掉不透明度
      byte[] tmp = new byte[MAX_RGB_BYTE_ARRAY_LENGTH];
      System.arraycopy(rgb, 1, tmp, 0, MAX_RGB_BYTE_ARRAY_LENGTH);
      return byteArrayToHexStr(tmp);
    }
    return byteArrayToHexStr(rgbByte);
  }

  private byte[] getRGBByte(final byte[] rgb) {
    if (rgb == null || rgb.length == 0) {
      return new byte[0];
    }
    int byteLength = rgb.length;
    byte[] tempRGB = new byte[byteLength];
    for (int i = 0; i < byteLength; i++) {
      tempRGB[i] = applyTint(tint, rgb[i]);
    }
    return tempRGB;
  }

  /**
   * 获取颜色(注: 首先获取自定义颜色, 如果自定义颜色为空, 再获取主题颜色)
   *
   * @return 颜色(16进制)[00 00 00]-[FF FF FF]
   */
  public String getColor() {
    if (rgb == null || rgb.length == 0) {
      return getThemeColor();
    }
    return getRGBColor();
  }

  public double[] getHSL() {
    if (hsl == null) {
      if (themeRGB != null) {
        hsl = ColorUtil.convertRGBToHSL(themeRGB[0], themeRGB[1], themeRGB[2]);
      } else if (rgb != null) {
        hsl = ColorUtil.convertRGBToHSL(rgb[0], rgb[1], rgb[2]);
      }
    }
    return hsl;
  }

}
